﻿#include "musiclist.h"

#include <QMimeDatabase>
#include <QDebug>
#include <QSqlQuery>
#include <QSqlError>

MusicList::MusicList() {}

void MusicList::addMusicByUrl(const QList<QUrl> &urls)
{
    for(auto &e : urls)
    {
        /*
         *         QMimeType mimeTypeForFile(const QString &fileName, MatchMode mode = MatchDefault) const
            QMimeDatabase类的mimeTypeForFile方法
                功能：获取fileName文件的MIME类型
                fileName：文件的名称
                mode: MatchMode为枚举类型，表明如何匹配文件的MIME类型
                    MatchDefault: 通过文件名和文件内容来进行查询匹配，文件名优先于文件内容，如果文件扩展名未知，
                                  或者匹配多个MIME类型，则使用文件内容匹配
                    MatchExtension: 通过文件
                    atchContent：通过文件内容来查询匹配

            toLocalFile() 的核心作用是：
            将 file:// 协议的 URL 转换为操作系统认可的本地文件路径。

            QMimeType类中的name属性，保存了获取到的MIME类型，
            可以通过该类的name()方法以字符串方式返回MIME类型

            audio/mpeg ： 适用于mp3格式的音频文件
            audio/flac :表示无损音频压缩格式
            audio/wav : 表示wav格式的歌曲文件
            上述三种音乐格式文件，Qt的QMediaPlayer类都是支持的
        */

        // 将加载音乐进来musicList, 可能存在重复音乐, 通过保存该音乐的路径来判断是否重复
        QString musicPath = e.toLocalFile();
        if(musicPaths.contains(musicPath))
        {
            // 该歌曲存在
            continue;
        }
        // 歌曲不存在
        this->musicPaths.insert(musicPath);


        // 由于添加进来的文件不一定是歌曲文件，因此需要再次筛选出音乐文件
        // 检测歌曲文件的MIME类型
        QMimeDatabase mimeDB;
        QMimeType mime = mimeDB.mimeTypeForFile(e.toLocalFile());
        QString mimeType = mime.name();

        if(mimeType == "audio/mpeg" || mimeType == "audio/flac" || mimeType == "audio/wav")
        {
            // 通过Url创建一个music对象,并保存
            Music music(e);
            musicList.push_back(music);
        }
    }
}

MusicList::iterator MusicList::findMusicById(const QString &musicId)
{
    for(auto it = begin(); it != end(); it++)
    {
        if(it->getMusicId() == musicId)
            return it;
    }

    return end();
}

MusicList::iterator MusicList::begin()
{
    return musicList.begin();
}

MusicList::iterator MusicList::end()
{
    return musicList.end();
}

void MusicList::writeToDB()
{
    for(auto music : musicList)
    {
        // 遍历每一个歌曲,分别将歌曲信息插入数据库中
        music.insertMusicToDB();
    }
}

void MusicList::readFromDB()
{
    //              id
    //    QString musicId;
    //    QString musicName;
    //    QString singerName;
    //    QString albumName;
    //    QUrl musicUrl;
    //    qint64 duration;
    //    bool isLike;
    //    bool isHistory;

    QSqlQuery query;
    query.prepare("SELECT musicId, musicName, singerName, albumName, musicUrl, duration, isLike, isHistory FROM MusicInfo");
    if(!query.exec())
    {
        qDebug() << "readFromDB, 查询失败: " << query.lastError().text();
        return;
    }

    while(query.next())
    {
        Music music;
        music.setMusicId(query.value(0).toString());
        music.setMusicName(query.value(1).toString());
        music.setSingerName(query.value(2).toString());
        music.setAlbumName(query.value(3).toString());
        music.setMusicUrl(QUrl::fromLocalFile(query.value(4).toString()));
        music.setDuration(query.value(5).toLongLong());
        music.setIsLike(query.value(6).toBool());
        music.setIsHistory(query.value(7).toBool());

        musicList.push_back(music);

        // 回复musicPaths的数据, 防止相同目录下歌曲被重复加载
        musicPaths.insert(music.getMusicUrl().toLocalFile());
    }
}
